
##############################################
#字符串
#第一种数据类型是str，表示字符串。字符串是以单引号或双引号括起来的任意文本。
#请注意，Python中没有单独的字符类型，一个字符就是长度为1的字符串。
#字符串是不可变的，也就是说，一旦创建了一个字符串，就不能改变它的值。
##############################################
#1. 字符串的定义
str1 = 'hello world'
str2 = "hello world"
str3 = '''hello world'''
str4 = """hello world"""
#2. 字符串的大小写
str1.title() #首字母大写
str1.upper() #全部大写
str1.lower() #全部小写
#3. 字符串的拼接
str1 + str2
str1 + ' ' + str2
#4. 制表符和换行符
"\n" #换行
"\t" #制表符
"\\n" #斜杠

#5. 删除空白
str1.rstrip() #删除末尾空白
str1.lstrip() #删除开头空白
str1.strip() #删除两端空白

#6. 字符串的索引
str1[0] #索引从0开始
str1[-1] #索引从-1开始
str1[0:5] #切片，从0到5
str1[:5] #切片，从0到5
str1[5:] #切片，从5到末尾
str1[-3:] #切片，从-3到末尾
str1[0:5:2] #切片，从0到5，步长为2
str1[::2] #切片，从0到末尾，步长为2

#7. 字符串的查找
str1.find('world') #查找world的位置
str1.find('world',0,5) #查找world的位置，从0到5
str1.count('world') #查找world的个数
str1.count('world',0,5) #查找world的个数，从0到5
str1.startswith('hello') #判断是否以hello开头
str1.endswith('world') #判断是否以world结尾
str1.isalpha() #判断是否全为字母
str1.isdigit() #判断是否全为数字
str1.isalnum() #判断是否全为字母或数字
str1.isspace() #判断是否全为空格
str1.islower() #判断是否全为小写
str1.isupper() #判断是否全为大写

#8. 字符串的替换
str1.replace('world','python') #将world替换为python
str1.replace('world','python',1) #将world替换为python，只替换1次

#9. 字符串的分割
str1.split() #以空格为分隔符，分割字符串
str1.split(' ') #以空格为分隔符，分割字符串
str1.split(' ',1) #以空格为分隔符，分割字符串，只分割1次
str1.splitlines() #以换行符为分隔符，分割字符串

#10. 字符串的格式化
str1.format() #格式化字符串
str1.format('world') #格式化字符串

#在最新的Python 3版本中，字符串是以Unicode编码的，也就是说，Python的字符串支持多语言，例如：
print('包含中文的str')
#对于单个字符的编码，Python提供了ord()函数获取字符的整数表示，chr()函数把编码转换为对应的字符：
ord('A') #65
ord('中')# 20013
chr(66) #'B'
chr(25991) #'文' 
"""
由于Python的字符串类型是str，在内存中以Unicode表示，一个字符对应若干个字节。如果要在网络上传输，或者保存到磁盘上，就需要把str变为以字节为单位的bytes。
Python对bytes类型的数据用带b前缀的单引号或双引号表示：  x = b'ABC'
要注意区分'ABC'和b'ABC'，前者是str，后者虽然内容显示得和前者一样，但bytes的每个字符都只占用一个字节。
以Unicode表示的str通过encode()方法可以编码为指定的bytes，例如：  'ABC'.encode('ascii')
或者 b'ABC'.decode('ascii')
"""

#字符串中的格式化
#在Python中，采用的格式化方式和C语言是一致的，用%实现，举例如下：
"""
常见的占位符有：
"%d" % 100"
"%f" % 100.12""
"%s" % "hello"""
#%x 用于输出十六进制数
#另一种格式化字符串的方法是使用字符串的format()方法，它会用传入的参数依次替换字符串内的占位符{0}、{1}……:
'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)


##############################################
#数字
##############################################
#1. 数字的定义
num1 = 1
num2 = 1.0 #浮点数
num3 = 1+2j #复数   
#2. 数字的运算
num1 + num2 #加法
num1 - num2 #减法
num1 * num2 #乘法
num1 / num2 #除法
num1 // num2 #整除
num1 % num2 #取余
num1 ** num2 #幂运算
num1 += num2 #自增
num1 -= num2 #自减
num1 *= num2 #自乘
num1 /= num2 #自除
num1 //= num2 #自整除
num1 %= num2 #自取余
num1 **= num2 #自幂运算

#3. 数字的转换
str(num1) #数字转字符串
int(num1) #数字转整数
float(num1) #数字转浮点数
complex(num1) #数字转复数

#4. 数字的比较
num1 == num2 #等于
num1 != num2 #不等于
num1 > num2 #大于
num1 < num2 #小于


##############################################
#列表  
#列表由一系列按特定顺序排列的元素组成。你可以创建包含字母表中所有字母、数字0~9或
#所有家庭成员姓名的列表；也可以将任何东西加入列表中，其中的元素之间可以没有任何关系。
#鉴于列表通常包含多个元素，给列表指定一个表示复数的名称（如letters、digits或names）是个不错的主意。
##############################################
#1. 列表的访问
list1 = [1,2,3,4,5]
list1[0] #访问第一个元素
list1[-1] #访问最后一个元素
list1[0:3] #访问前三个元素
list1[:3] #访问前三个元素
list1[3:] #访问从三个元素
list1[-3:] #访问后三个元素

#2. 列表的增删改查
list1.append(6) #添加元素
list1.insert(0,0) #插入元素
list1.pop() #删除最后一个元素(弹出元素)
list1.pop(0) #删除第一个元素   (弹出元素 )   
list1.remove(1) #删除元素1
list1[0] = 0 #修改第一个元素
list1.index(1) #查找元素1的位置
list1.count(1) #查找元素1的个数 
#3. 列表的排序
list1.sort() #升序排序
list1.sort(reverse=True) #降序排序  
list1.reverse() #倒序排序
sorted(list1) #排序(临时排序)

#4. 列表的拷贝
list2 = list1.copy() #拷贝列表
list3 = list1[:] #拷贝列表
list4 = list1 #拷贝列表(引用)
list5 = list1 + [] #拷贝列表
#5. 列表的清空
list1.clear() #清空列表 

#6. 列表的嵌套
list1 = [1,2,3,4,5] 
list2 = [6,7,8,9,10]
list3 = [list1,list2] #列表的嵌套
list3[0][0] #访问第一个元素

#使用range()生成数字列表
list(range(1,11)) #生成1到10的数字列表

#7. 列表的推导式
list2 = [i*2 for i in list1] #列表的推导式
list3 = [i*2 for i in list1 if i>3] #列表的推导式



##############################################
#元组
#不可变的列表被称为元组。
##############################################
#1. 元组的访问
tuple1 = (1,2,3,4,5)
tuple1[0] #访问第一个元素

#虽然不能修改元组的元素，但可以给存储元组的变量重新赋值。
tuple1 = (1,2,3,4,5)
tuple1 = (6,7,8,9,10)



##############################################  
#字典
#字典是一系列键值对。每个键都与一个值相关联，你可以使用键来访问与之相关联的值。
#与键相关联的值可以是数字、字符串、列表乃至字典。事实上，可将任何Python对象用作字典中的值。
##############################################
"""
在其他语言中也称为map，使用键-值（key-value）存储，具有极快的查找速度。和list比较，dict有以下几个特点：
查找和插入的速度极快，不会随着key的增加而变慢；
需要占用大量的内存，内存浪费多
"""

#1. 字典的访问
dict1 = {'name':'张三','age':18,'sex':'男'}
dict1['name'] #访问name键的值

#2. 字典的增删改查
dict1['name'] = '李四' #修改name键的值（也可以是添加）
dict1['age'] = 19 #修改age键的值
del dict1['name'] #删除name键的值
dict1.pop('name') #删除name键的值
dict1.popitem() #删除最后一个键值对
#3. 字典的遍历
for key,value in dict1.items(): #遍历字典
    print(key,value) #打印键和值

for key in dict1.keys(): #遍历字典的键
    print(key) #打印键
for value in dict1.values(): #遍历字典的值
    print(value) #打印值
#4. 字典的嵌套
dict1 = {'name':'张三','age':18,'sex':'男','info':{'name':'李四','age':19,'sex':'男'}} #字典的嵌套
dict1['info']['name'] #访问info键的值的name键的值

# 字典和列表可以相互嵌套。

#dir.get（key，n/a） #true返回value，false返n/a
#dir.setdefualt（key，value） #若不存在，则创建此键值对
#dir.copy()  #生成一个浅复制
